import json
import re
from typing import Any

import scrapy
from scrapy.http import Response

from apps.tender_project.tender_project.base.base_project_spider import BaseProjectSpider
from apps.tender_project.tender_project.items import NetTenderInfoItem, make_item
from apps.tender_project.tender_project.utils.re_ import XING
from utils.tools import parse_url_params
"""
  `project_name` varchar(255) DEFAULT NULL COMMENT '项目名称',
  `register_num` varchar(255) DEFAULT NULL COMMENT '项目编号',
  `project_desc` json DEFAULT NULL COMMENT '项目描述 json_object {"content":"详情"}',
  `budget_amount` decimal(16,6) DEFAULT NULL COMMENT '预算金额(万元)',
  `max_price` decimal(16,6) DEFAULT NULL COMMENT '最高限价(万元)',
  `buying_require` json DEFAULT NULL COMMENT '采购需求 json_object {"content":"采购需求"}',
  `accept_combo` varchar(255) DEFAULT NULL COMMENT '项目接受联合体投标',
  `bidder_qualification` json DEFAULT NULL COMMENT '普通资格要求 json_object {"content":"采购需求"}',
  `leader_qualification` json DEFAULT NULL COMMENT '项目经理资格要求 json_object {"content":"项目经理资格要求"}',
  `other_qualification` json DEFAULT NULL COMMENT '项目特定资格要求 json_object {"content":"项目特定资格要求"}',
  `deadline` datetime DEFAULT NULL COMMENT '截止时间',
  `open_time` datetime DEFAULT NULL COMMENT '开标时间',
  `buying_type` varchar(255) DEFAULT NULL COMMENT '采购方式(竞争性磋商、竞争性谈判、公开招标)',
  `buying_name` varchar(255) DEFAULT NULL COMMENT '采购方名称',
  `buying_tel` varchar(500) DEFAULT NULL COMMENT '采购方联系方式',
  `contact_name` varchar(255) DEFAULT NULL COMMENT '项目联系联系人',
  `contact_tel` varchar(500) DEFAULT NULL COMMENT '项目联系人电话',
  `agency` varchar(255) DEFAULT NULL COMMENT '采购执行机构名称',
  `agency_tel` varchar(500) DEFAULT NULL COMMENT '采购执行机构联系方式',
  `source` varchar(255) NOT NULL COMMENT '来源平台',
  `source_url` varchar(500) NOT NULL COMMENT '来源平台链接',
  `state` tinyint(4) DEFAULT '1' COMMENT '数据状态（1可用，-1无效）',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

"""


class QgJiangxiTender(BaseProjectSpider):
    name = 'qg_jiangxi_tender'
    source = "江西省全国公共交易平台"
    province = "江西省"

    url = "https://www.jxsggzy.cn/XZinterface/rest/esinteligentsearch/getFullTextDataNew"

    custom_settings = {
        "COOKIES_ENABLED": False
    }

    def start_requests(self):
        city_list = {
            '3600': '江西省', '3601': '南昌市', '3602': '景德镇市', '3603': '萍乡市', '3604': '九江市', '3605': '新余市',
            '3606': '鹰潭市', '3607': '赣州市', '3608': '吉安市', '3609': '宜春市', '3610': '抚州市', '3611': '上饶市',
            '3612': '赣江新区'
        }

        datalist = [{'xiaqu': '省本级', 'itemlevcode': '360001', 'xiaqucode': '360001'},
                    {'xiaqu': '省农垦', 'itemlevcode': '360002', 'xiaqucode': '360002'},
                    {'xiaqu': '南昌市本级', 'itemlevcode': '360101', 'xiaqucode': '360101'},
                    {'xiaqu': '东湖区', 'itemlevcode': '360102', 'xiaqucode': '360102'},
                    {'xiaqu': '西湖区', 'itemlevcode': '360103', 'xiaqucode': '360103'},
                    {'xiaqu': '青云谱区', 'itemlevcode': '360104', 'xiaqucode': '360104'},
                    {'xiaqu': '湾里区', 'itemlevcode': '360105', 'xiaqucode': '360105'},
                    {'xiaqu': '桑海经济技术开发区', 'itemlevcode': '360110', 'xiaqucode': '360110'},
                    {'xiaqu': '青山湖区', 'itemlevcode': '360111', 'xiaqucode': '360111'},
                    {'xiaqu': '南昌县', 'itemlevcode': '360121', 'xiaqucode': '360121'},
                    {'xiaqu': '新建区', 'itemlevcode': '360122', 'xiaqucode': '360122'},
                    {'xiaqu': '安义县', 'itemlevcode': '360123', 'xiaqucode': '360123'},
                    {'xiaqu': '进贤县', 'itemlevcode': '360124', 'xiaqucode': '360124'},
                    {'xiaqu': '高新技术产业开发区', 'itemlevcode': '360125', 'xiaqucode': '360125'},
                    {'xiaqu': '红谷滩新区', 'itemlevcode': '360126', 'xiaqucode': '360126'},
                    {'xiaqu': '经济技术开发区', 'itemlevcode': '360130', 'xiaqucode': '360130'},
                    {'xiaqu': '临空经济区', 'itemlevcode': '360131', 'xiaqucode': '360131'},
                    {'xiaqu': '景德镇市本级', 'itemlevcode': '360201', 'xiaqucode': '360201'},
                    {'xiaqu': '昌江区', 'itemlevcode': '360202', 'xiaqucode': '360202'},
                    {'xiaqu': '珠山区', 'itemlevcode': '360203', 'xiaqucode': '360203'},
                    {'xiaqu': '高新开发区', 'itemlevcode': '360204', 'xiaqucode': '360204'},
                    {'xiaqu': '陶瓷科技园', 'itemlevcode': '360205', 'xiaqucode': '360205'},
                    {'xiaqu': '浮梁县', 'itemlevcode': '360222', 'xiaqucode': '360222'},
                    {'xiaqu': '乐平市', 'itemlevcode': '360281', 'xiaqucode': '360281'},
                    {'xiaqu': '萍乡市本级', 'itemlevcode': '360301', 'xiaqucode': '360301'},
                    {'xiaqu': '安源区', 'itemlevcode': '360302', 'xiaqucode': '360302'},
                    {'xiaqu': '萍乡经济技术开发区', 'itemlevcode': '360303', 'xiaqucode': '360303'},
                    {'xiaqu': '湘东区', 'itemlevcode': '360313', 'xiaqucode': '360313'},
                    {'xiaqu': '莲花县', 'itemlevcode': '360321', 'xiaqucode': '360321'},
                    {'xiaqu': '上栗县', 'itemlevcode': '360322', 'xiaqucode': '360322'},
                    {'xiaqu': '芦溪县', 'itemlevcode': '360323', 'xiaqucode': '360323'},
                    {'xiaqu': '九江市本级', 'itemlevcode': '360401', 'xiaqucode': '360401'},
                    {'xiaqu': '濂溪区', 'itemlevcode': '360402', 'xiaqucode': '360402'},
                    {'xiaqu': '浔阳区', 'itemlevcode': '360403', 'xiaqucode': '360403'},
                    {'xiaqu': '九江经济技术开发区', 'itemlevcode': '360404', 'xiaqucode': '360404'},
                    {'xiaqu': '庐山西海', 'itemlevcode': '360405', 'xiaqucode': '360405'},
                    {'xiaqu': '八里湖新区', 'itemlevcode': '360406', 'xiaqucode': '360406'},
                    {'xiaqu': '柴桑区', 'itemlevcode': '360421', 'xiaqucode': '360421'},
                    {'xiaqu': '武宁县', 'itemlevcode': '360423', 'xiaqucode': '360423'},
                    {'xiaqu': '修水县', 'itemlevcode': '360424', 'xiaqucode': '360424'},
                    {'xiaqu': '永修县', 'itemlevcode': '360425', 'xiaqucode': '360425'},
                    {'xiaqu': '德安县', 'itemlevcode': '360426', 'xiaqucode': '360426'},
                    {'xiaqu': '庐山市', 'itemlevcode': '360427', 'xiaqucode': '360427'},
                    {'xiaqu': '都昌县', 'itemlevcode': '360428', 'xiaqucode': '360428'},
                    {'xiaqu': '湖口县', 'itemlevcode': '360429', 'xiaqucode': '360429'},
                    {'xiaqu': '彭泽县', 'itemlevcode': '360430', 'xiaqucode': '360430'},
                    {'xiaqu': '共青城市', 'itemlevcode': '360471', 'xiaqucode': '360471'},
                    {'xiaqu': '瑞昌市', 'itemlevcode': '360481', 'xiaqucode': '360481'},
                    {'xiaqu': '庐山管理局', 'itemlevcode': '360491', 'xiaqucode': '360491'},
                    {'xiaqu': '新余市本级', 'itemlevcode': '360501', 'xiaqucode': '360501'},
                    {'xiaqu': '渝水区', 'itemlevcode': '360502', 'xiaqucode': '360502'},
                    {'xiaqu': '仙女湖区', 'itemlevcode': '360504', 'xiaqucode': '360504'},
                    {'xiaqu': '高新区', 'itemlevcode': '360505', 'xiaqucode': '360505'},
                    {'xiaqu': '孔目江区', 'itemlevcode': '360506', 'xiaqucode': '360506'},
                    {'xiaqu': '分宜县', 'itemlevcode': '360521', 'xiaqucode': '360521'},
                    {'xiaqu': '鹰潭市本级', 'itemlevcode': '360601', 'xiaqucode': '360601'},
                    {'xiaqu': '月湖区', 'itemlevcode': '360602', 'xiaqucode': '360602'},
                    {'xiaqu': '余江区', 'itemlevcode': '360622', 'xiaqucode': '360622'},
                    {'xiaqu': '贵溪市', 'itemlevcode': '360681', 'xiaqucode': '360681'},
                    {'xiaqu': '龙虎山风景旅游区', 'itemlevcode': '360682', 'xiaqucode': '360682'},
                    {'xiaqu': '高新区', 'itemlevcode': '360683', 'xiaqucode': '360683'},
                    {'xiaqu': '信江新区', 'itemlevcode': '360684', 'xiaqucode': '360684'},
                    {'xiaqu': '赣州市本级', 'itemlevcode': '360701', 'xiaqucode': '360701'},
                    {'xiaqu': '章贡区', 'itemlevcode': '360702', 'xiaqucode': '360702'},
                    {'xiaqu': '开发区', 'itemlevcode': '360703', 'xiaqucode': '360703'},
                    {'xiaqu': '赣县区', 'itemlevcode': '360721', 'xiaqucode': '360721'},
                    {'xiaqu': '信丰县', 'itemlevcode': '360722', 'xiaqucode': '360722'},
                    {'xiaqu': '大余县', 'itemlevcode': '360723', 'xiaqucode': '360723'},
                    {'xiaqu': '上犹县', 'itemlevcode': '360724', 'xiaqucode': '360724'},
                    {'xiaqu': '崇义县', 'itemlevcode': '360725', 'xiaqucode': '360725'},
                    {'xiaqu': '安远县', 'itemlevcode': '360726', 'xiaqucode': '360726'},
                    {'xiaqu': '龙南市', 'itemlevcode': '360727', 'xiaqucode': '360727'},
                    {'xiaqu': '定南县', 'itemlevcode': '360728', 'xiaqucode': '360728'},
                    {'xiaqu': '全南县', 'itemlevcode': '360729', 'xiaqucode': '360729'},
                    {'xiaqu': '宁都县', 'itemlevcode': '360730', 'xiaqucode': '360730'},
                    {'xiaqu': '于都县', 'itemlevcode': '360731', 'xiaqucode': '360731'},
                    {'xiaqu': '兴国县', 'itemlevcode': '360732', 'xiaqucode': '360732'},
                    {'xiaqu': '会昌县', 'itemlevcode': '360733', 'xiaqucode': '360733'},
                    {'xiaqu': '寻乌县', 'itemlevcode': '360734', 'xiaqucode': '360734'},
                    {'xiaqu': '石城县', 'itemlevcode': '360735', 'xiaqucode': '360735'},
                    {'xiaqu': '蓉江新区', 'itemlevcode': '360763', 'xiaqucode': '360763'},
                    {'xiaqu': '瑞金市', 'itemlevcode': '360781', 'xiaqucode': '360781'},
                    {'xiaqu': '南康区', 'itemlevcode': '360782', 'xiaqucode': '360782'},
                    {'xiaqu': '吉安市本级', 'itemlevcode': '360801', 'xiaqucode': '360801'},
                    {'xiaqu': '吉州区', 'itemlevcode': '360802', 'xiaqucode': '360802'},
                    {'xiaqu': '青原区', 'itemlevcode': '360803', 'xiaqucode': '360803'},
                    {'xiaqu': '经开区', 'itemlevcode': '360809', 'xiaqucode': '360809'},
                    {'xiaqu': '安福武功山风景名胜区', 'itemlevcode': '360812', 'xiaqucode': '360812'},
                    {'xiaqu': '吉安县', 'itemlevcode': '360821', 'xiaqucode': '360821'},
                    {'xiaqu': '吉水县', 'itemlevcode': '360822', 'xiaqucode': '360822'},
                    {'xiaqu': '峡江县', 'itemlevcode': '360823', 'xiaqucode': '360823'},
                    {'xiaqu': '新干县', 'itemlevcode': '360824', 'xiaqucode': '360824'},
                    {'xiaqu': '永丰县', 'itemlevcode': '360825', 'xiaqucode': '360825'},
                    {'xiaqu': '泰和县', 'itemlevcode': '360826', 'xiaqucode': '360826'},
                    {'xiaqu': '遂川县', 'itemlevcode': '360827', 'xiaqucode': '360827'},
                    {'xiaqu': '万安县', 'itemlevcode': '360828', 'xiaqucode': '360828'},
                    {'xiaqu': '安福县', 'itemlevcode': '360829', 'xiaqucode': '360829'},
                    {'xiaqu': '永新县', 'itemlevcode': '360830', 'xiaqucode': '360830'},
                    {'xiaqu': '井冈山市', 'itemlevcode': '360881', 'xiaqucode': '360881'},
                    {'xiaqu': '宜春市本级', 'itemlevcode': '360901', 'xiaqucode': '360901'},
                    {'xiaqu': '袁州区', 'itemlevcode': '360902', 'xiaqucode': '360902'},
                    {'xiaqu': '宜春市经济技术开发区', 'itemlevcode': '360903', 'xiaqucode': '360903'},
                    {'xiaqu': '宜阳新区', 'itemlevcode': '360904', 'xiaqucode': '360904'},
                    {'xiaqu': '明月山风景名胜区', 'itemlevcode': '360905', 'xiaqucode': '360905'},
                    {'xiaqu': '奉新县', 'itemlevcode': '360921', 'xiaqucode': '360921'},
                    {'xiaqu': '万载县', 'itemlevcode': '360922', 'xiaqucode': '360922'},
                    {'xiaqu': '上高县', 'itemlevcode': '360923', 'xiaqucode': '360923'},
                    {'xiaqu': '宜丰县', 'itemlevcode': '360924', 'xiaqucode': '360924'},
                    {'xiaqu': '靖安县', 'itemlevcode': '360925', 'xiaqucode': '360925'},
                    {'xiaqu': '铜鼓县', 'itemlevcode': '360926', 'xiaqucode': '360926'},
                    {'xiaqu': '丰城市', 'itemlevcode': '360981', 'xiaqucode': '360981'},
                    {'xiaqu': '樟树市', 'itemlevcode': '360982', 'xiaqucode': '360982'},
                    {'xiaqu': '高安市', 'itemlevcode': '360983', 'xiaqucode': '360983'},
                    {'xiaqu': '抚州市本级', 'itemlevcode': '361001', 'xiaqucode': '361001'},
                    {'xiaqu': '临川区', 'itemlevcode': '361002', 'xiaqucode': '361002'},
                    {'xiaqu': '南城县', 'itemlevcode': '361021', 'xiaqucode': '361021'},
                    {'xiaqu': '黎川县', 'itemlevcode': '361022', 'xiaqucode': '361022'},
                    {'xiaqu': '南丰县', 'itemlevcode': '361023', 'xiaqucode': '361023'},
                    {'xiaqu': '崇仁县', 'itemlevcode': '361024', 'xiaqucode': '361024'},
                    {'xiaqu': '乐安县', 'itemlevcode': '361025', 'xiaqucode': '361025'},
                    {'xiaqu': '宜黄县', 'itemlevcode': '361026', 'xiaqucode': '361026'},
                    {'xiaqu': '金溪县', 'itemlevcode': '361027', 'xiaqucode': '361027'},
                    {'xiaqu': '资溪县', 'itemlevcode': '361028', 'xiaqucode': '361028'},
                    {'xiaqu': '东乡区', 'itemlevcode': '361029', 'xiaqucode': '361029'},
                    {'xiaqu': '广昌县', 'itemlevcode': '361030', 'xiaqucode': '361030'},
                    {'xiaqu': '广昌县新农村建设招标办', 'itemlevcode': '361032', 'xiaqucode': '361032'},
                    {'xiaqu': '高新区', 'itemlevcode': '361061', 'xiaqucode': '361061'},
                    {'xiaqu': '东临新区', 'itemlevcode': '361062', 'xiaqucode': '361062'},
                    {'xiaqu': '上饶市本级', 'itemlevcode': '361101', 'xiaqucode': '361101'},
                    {'xiaqu': '信州区', 'itemlevcode': '361102', 'xiaqucode': '361102'},
                    {'xiaqu': '广信区', 'itemlevcode': '361121', 'xiaqucode': '361121'},
                    {'xiaqu': '广丰区', 'itemlevcode': '361122', 'xiaqucode': '361122'},
                    {'xiaqu': '玉山县', 'itemlevcode': '361123', 'xiaqucode': '361123'},
                    {'xiaqu': '铅山县', 'itemlevcode': '361124', 'xiaqucode': '361124'},
                    {'xiaqu': '横峰县', 'itemlevcode': '361125', 'xiaqucode': '361125'},
                    {'xiaqu': '弋阳县', 'itemlevcode': '361126', 'xiaqucode': '361126'},
                    {'xiaqu': '余干县', 'itemlevcode': '361127', 'xiaqucode': '361127'},
                    {'xiaqu': '鄱阳县', 'itemlevcode': '361128', 'xiaqucode': '361128'},
                    {'xiaqu': '万年县', 'itemlevcode': '361129', 'xiaqucode': '361129'},
                    {'xiaqu': '婺源县', 'itemlevcode': '361130', 'xiaqucode': '361130'},
                    {'xiaqu': '德兴市', 'itemlevcode': '361181', 'xiaqucode': '361181'},
                    {'xiaqu': '经济技术开发区', 'itemlevcode': '361182', 'xiaqucode': '361182'},
                    {'xiaqu': '三清山管理委员会', 'itemlevcode': '361183', 'xiaqucode': '361183'},
                    {'xiaqu': '上饶高铁经济试验区', 'itemlevcode': '361185', 'xiaqucode': '361185'},
                    {'xiaqu': '赣江新区本级', 'itemlevcode': '361201', 'xiaqucode': '361201'},
                    {'xiaqu': '临空组团', 'itemlevcode': '361202', 'xiaqucode': '361202'},
                    {'xiaqu': '经开组团', 'itemlevcode': '361203', 'xiaqucode': '361203'},
                    {'xiaqu': '桑海产业园', 'itemlevcode': '361204', 'xiaqucode': '361204'},
                    {'xiaqu': '赣江新区中医药科创城', 'itemlevcode': '361205', 'xiaqucode': '361205'}]

        projectcodelist = {
            '房建及市政工程_招标公告': '002001001',
            # '重点工程_招标公告': '002004001',
            # '其他项目_招标公告': '002013001',
            # '交通工程_招标公告': '002002002',
            # '水利工程_资格预审公告和招标公告': '002003001',
            # '政府采购_采购公告': '002006001'
        }

        for citycode in datalist:
            for projectname, projectcode in projectcodelist.items():
                data = {
                    "token": "",
                    "pn": 0,
                    "rn": 10000,
                    "sdt": "",
                    "edt": "",
                    "wd": "",
                    "inc_wd": "",
                    "exc_wd": "",
                    "fields": "",
                    "cnum": "",
                    "sort": "{\"webdate\":\"0\",\"id\":\"0\"}",
                    "ssort": "",
                    "cl": 10000,
                    "terminal": "",
                    "condition": [],
                    "time": [
                        {
                            "fieldName": "webdate",
                            "startTime": "2021-01-01 00:00:00",
                            "endTime": "2024-11-26 23:59:59"
                        }
                    ],
                    "highlights": "",
                    "statistics": None,
                    "unionCondition": [],
                    "accuracy": "",
                    "noParticiple": "1",
                    "searchRange": None,
                    "noWd": True
                }
                xiaquname = citycode["xiaqu"]
                code = citycode["xiaqucode"]
                city = city_list[code[:4]]
                condition = [
                    {
                        "fieldName": "categorynum",
                        "equal": projectcode,
                        "notEqual": None,
                        "equalList": None,
                        "notEqualList": None,
                        "isLike": True,
                        "likeType": 2
                    },
                    {
                        "fieldName": "xiaqucode",
                        "equal": code,
                        "notEqual": None,
                        "equalList": None,
                        "notEqualList": None,
                        "isLike": True,
                        "likeType": 2
                    }
                ]
                data = {**data, "condition": condition}
                data = json.dumps(data, separators=(',', ':'))

                yield scrapy.Request(
                    self.url, method='POST',
                    body=data,
                    callback=self.parse,
                    meta={"data": data, "xiaquname": xiaquname, "projectname": projectname, "city": city},
                )

    def parse(self, response: Response, **kwargs: Any) -> Any:

        data = response.json()["result"]["records"]
        # print(data)

        for res in data:
            meta = response.meta
            new_meta = {
                "title": res["titlenew"],
                "province": "江西省",
                "city": response.meta.get("city"),
                "region": response.meta.get("xiaquname"),
                "data_type": res["categoryname"],
                "get_date": res["webdate"],
            }
            # if res["categoryname"] == '流标公告':
            #     continue
            meta.update(**new_meta)
            url = "https://www.jxsggzy.cn/" + res["linkurl"]
            # if url not in ['https://www.jxsggzy.cn//jyxx/002006/002006004/20230712/3273ec46-09e3-433e-9eeb-15f0fa31cefa.html']:
            #     continue
            yield scrapy.Request(
                url,
                callback=self.parse_detail,
                meta=meta
            )

    def parse_detail(self, response, **kwargs):

        title = response.xpath("//*[contains(@class, 'article-title')]/text()").get() or response.meta['title']
        if any([i in response.text for i in ['招标失败公告', '招标代理服务中标结果公告']]):
            return
        data_string_pro = re.sub(r"[\n\t\r\s]", "",
                                 "".join(response.xpath("/html/body/div[2]").xpath("//text()").getall()))
        try:
            data_string = self.del_html_tag(response.text)
        except:
            data_string = data_string_pro

        if any([i in data_string for i in ['招标失败公告']]):
            return
        # if '工期' not in data_string:
        #     return
        base_item = dict(
            source=self.source,
            province=self.province,
            city=response.meta["city"],
            region=response.meta.get("xiaquname"),
            data_type=response.meta.get('data_type'),
            source_url=response.url,
            get_date=response.meta["get_date"],
            title=title,
        )

        rules = {
            "register_num": [r"编号[:：为]?([\(\)a-zA-Z\d-]{2,25})"],
            "project_name": [
                r"项目名称[:：为]?\s*(.{2,100})\s*[；]?",
                r"招标条件\s*(.{2,100})\s*已具备招标条件",
                r"本工程\s*(.{2,100})\s*已",
                r"工程名称\s*([^\s]{2,100})\s*",
                r"招标工程项目\s*([^\s]{2,100})\s*",
            ],
            "budget_amount": [
                r"总投资额[:：为约]+\s*([^预算\n]{1,100})",
                r"总预算金额[:：为]+\s*([^预算\n]{1,100})",
                r"预算金额[:：为]?\s*([^预算\n]{1,100})\s*",
                r"预算金额[:：为]?\s*([^预算]{1,100})\s*",
                r"预算金额[:：为]?\s*([^预算]{1,100})\s*",
                r"估算价[:：为]?\s*([^预算\n]{1,100})\s*",
                r"总投资估算[:：为约]?\s*([^预算\n]{1,100})\s*",
                r"项目监理费[:：为约]?\s*([^预算\n]{1,100})\s*",
                r"投资额及来源[:：为]?\s*([^预算\n]{1,100})\s*",
                r"项目总投资[:：为]?\s*([^预算\n]{1,100})\s*",
                r"本项目投资[:：为]?\s*([^预算\n]{1,100})\s*",
                r"本项目勘察费[:：为约]?\s*([^预算\n]{1,100})\s*",
            ],
            "max_price": [r"最高限价[:：为]?\s*([^限。\n]{1,100})\s*"],
            "buying_require": [
                r"采购需求[:：为]?\s*(.{7,1000})\s*",
                r"采购主要内容[:：为]?\s*(.{7,1000})\s*"],
            "accept_combo": [
                r"是否接受联合体投标[:：为]?\s*(.{1,100})\s*",
                r"本专业承包工程资格预审\s*(.{0,7})\s*联合体资格",
                r"本项目([不接受]+)联合体投标",
            ],
            "bidder_qualification": [
                r"资格要求[:：为]?\s*([\W\w]{5,1000})\s*[一二三][、][获取招标文件四]*",
                r"申请人资格要求[:：为]?\s*([\W\w]{5,1000}?)\s*[\d．]*资格预审方法",
                r"投标人应具备的特殊要求：\s*([\W\w]{5,1000})\s*[一二三四][、][获取招标文件]*",
                r"一般资格要求：\s*([\W\w]{5,1000})\s*[一二三四][、][获取招标文件]*",
            ],
            "leader_qualification": [
                r"项目经理[资格]?要求[:：为]?\s*(.{5,100})\s*",
                r"项目经理须具备([^。]{1,500})",
                r"投标人资质等级[:：为]?\s*([^\s]{5,100})\s*",
            ],
            "other_qualification": [
                r"项目特定[资格]?要求[:：为]?\s*(.{5,100})\s*",
            ],
            "deadline": [r"截止[\W\w]{0,10}时间[:：为]?\s*(.{0,12}(?:\d{4}\s*年?\s*\d{1,2}月?).{0,100})\s*"],
            "open_time": [
                r"开标时间[:：为]?\s*([^起]{0,12}(?:\d{4}\s*年?\s*\d{1,2}月?).{0,100})\s*",
                r"开标时间[:：为]?\s*(.{0,12}(?:\d{4}年?\d{1,2}月?).{0,100})\s*",
            ],
            "buying_name": [
                r"采购人(?:[\W\w]{1,10})称[:：为]?\s*([^，]{5,100})\s*",
                r"招标人[:：为]*\s*([^,，]{5,100})\s*",
                r"采购人[ \n:：为](\W{5,20})\s*",
                r"标\s人[:：为](.{3,})\s",
                r"招标人[：:\s]\s(.*)\s?地\s?址",
            ],
            "agency": [
                r"采购执行机构(?:[\W\w]{1,10})称[:：为]?\s*([^\s]{5,100})\s*",
                r"采购代理机构(?:[\W\w]{1,10})称[:：为]?\s*([^\s]{5,100})\s*",
                r"机构信息[\s]?名称[:：\s]+(.*)\s",
                r"釆购人信息[\s]?名称[:：\s]+(.*)\s",
                r"招标代理机构[：:\s]\s(.*)\s?地\s?址",
            ],
            "agency_tel": [
                r"采购执行机构(?:[\W\w]{1,10})式[:：为]?\s*([^\s]{5,100})\s*",
                r"采购代理机构(?:[\W\w]{1,10})式[:：为]?\s*([^\s]{5,100})\s*",
                r"机构信息\s.*\s.*\s.*\s.*\s联系方式[:： \s]+(.*)\s",
                r"机构信息[\s]?.*\s.*\s联系方式[:：\s]+(.*)",
                r"釆购人信息[\s]?.*\s.*\s联系方式[:：\s]+(.*)",

                r"联\s?系\s?人[:：\s].*\s?联\s?系\s?电\s?话[:：\s]\s?(.*)",
            ],
            "contact_name": [
                r"项目(?:[\W\w]{1,10})联系人[及电话]*[:：为]?\s*(.{5,100})\s*",
                r"文件联系人[:：为]?\s*([^\s]{5,100})\s*",
                r"项目联系人[:：为]?\s*([^\s]{5,100})\s*",
                r"项目联系人[:：为]\s(.*[\s]?[电话：]+\s.*)",
                r"项目联系人[: ：\s](.*)",
            ],
            "project_desc": [
                r"招标范围\s*([\W\w]{1,500}?)[\d．]*申请人资格要求",
                r"招标范围包括[:：]([^。]{5,500})",
                r"招标范围[:：]?\n(.*?)(?:\n)",
                r"招标内容及范围[:：]?\n(.*?)(?:\n)",
                r"段招标范围[:：](.*?。)(?:\n)",
                r"招标内容[:：]([^。\s]{3,200})",
                r"项目概况[：:\s]+(.*)",
            ],
        }
        item = self.gen_item_with_reg(
            data_string,
            rules,
            base_item,
            need_check=["buying_name", "contact_name", "agency", "project_name", "accept_combo"],
            html=response.text,
        )
        if not item['project_name']:
            item['project_name'] = item['title'].split('"[变更公告"')[0].split("]")[-1]
        bidder_qualification = self.reg_one([
            r"二、投标[单位人]资格条件\\n(.*?)(?:\\n三、)",
            r"3\.投标人资格要求\\n(.*?)(?:\\n4\.招标文件的获取)",
            r"投标（申请）人应具备的资格条件\\n(.*?)(?:\\n资格审查时应提供)",
        ], repr(data_string))
        if bidder_qualification:
            bidder_qualification = bidder_qualification.replace("\\n", "\n")
            if not item['bidder_qualification'] or len(bidder_qualification) > len(item['bidder_qualification']):
                item['bidder_qualification'] = bidder_qualification

        for k, v in item.items():
            if not v:
                item = self.gen_item_with_reg(data_string, {k: rules[k]}, item, need_check=[k], html=response.text)
            if v:
                if k in ['buying_require', 'bidder_qualification', 'leader_qualification', 'other_qualification', 'project_desc', ]:
                    item[k] = {'content': v}

        data_string_pro = re.sub(r"[\n\t\r\s]", "", "".join(response.xpath("//text()").getall()))
        if item:
            item = make_item(NetTenderInfoItem, item)
            # self.logger.info(json.dumps(item.to_dict, indent=4, ensure_ascii=False))
            # item.pre_to_db()  # 先清洗下
            item_dict = item.to_dict
            item_dict = self.check_and_fill_tel(item_dict, data_string_pro, response)
            # self.logger.error(json.dumps(item.to_dict, indent=4, ensure_ascii=False))

            item = make_item(NetTenderInfoItem, item_dict)
            yield item
            # print(item_dict)

    def check_and_fill_tel(self, item_dict, data_string_pro, response):
        if item_dict.get("buying_name"):
            item_dict = self.gen_item_with_reg(
                data_string_pro,
                {
                    "buying_tel": [
                        f'{item_dict["buying_name"]}' + r"[\W\w]{0,20}联\s*系\s*人[:：为]?([^。\n]{5,100})\s*"],
                },
                item_dict,
                need_check=["buying_tel"],
                html=response.text,
            )
        if item_dict.get("agency"):
            item_dict = self.gen_item_with_reg(
                data_string_pro,
                {
                    "agency_tel": [
                        f'{item_dict["agency"]}' + r"[\W\w]{0,100}联\s*系\s*人[及电话]*[:：为]+([^。\s]{5,100})\s*"],
                },
                item_dict,
                need_check=["agency_tel"],
                html=response.text,
            )
        return item_dict


if __name__ == '__main__':
    from scrapy import cmdline

    cmdline.execute("scrapy crawl qg_jiangxi_tender".split())
